package com.ruoyi.gbase.controller;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.gbase.domain.TableInfo;
import com.ruoyi.gbase.service.ITableInfoService;
import com.ruoyi.gbase.util.GbaseLoadUtil;
import com.ruoyi.gbase.util.GbaseUtil;
import com.ruoyi.nsh.util.DateUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 下发基础表Controller
 * 
 * @author yys
 * @date 2020-10-27
 */
@Controller
@RequestMapping("/gbase/TABLEINFO")
public class TableInfoController extends BaseController
{
    private String prefix = "gbase/TABLEINFO";

    @Autowired
    private GbaseUtil gbaseUtil;

    @Autowired
    private ITableInfoService tableInfoService;

    @Autowired
    private GbaseLoadUtil gbaseLoad;

    @RequiresPermissions("gbase:TABLEINFO:view")
    @GetMapping()
    public String TABLEINFO()
    {
        return prefix + "/TABLEINFO";
    }

    /**
     * 查询下发基础表列表
     */
    @RequiresPermissions("gbase:TABLEINFO:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(TableInfo tableInfo)
    {
        tableInfo.setEtlDate(tableInfo.getEtlDate().replace("-",""));
        startPage();
        List<TableInfo> list = tableInfoService.selectTableInfoList(tableInfo);
        return getDataTable(list);
    }

    /**
     * 导出下发基础表列表
     */
    @RequiresPermissions("gbase:TABLEINFO:export")
    @Log(title = "下发基础表", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(TableInfo tableInfo)
    {
        List<TableInfo> list = tableInfoService.selectTableInfoList(tableInfo);
        ExcelUtil<TableInfo> util = new ExcelUtil<TableInfo>(TableInfo.class);
        return util.exportExcel(list, "TABLEINFO");
    }

    /**
     * 当天全部数据入库 暂时不加全量  全量26日已经执行过了
     * 自动_增变量表入库 也就是类型为1 的  这种最复杂
     * 自动_全量表入库 也就是类型为0的  这种非常简单
     * 自动_增量+大文本增量表入库 也就是类型为2+5 的  这种非常简单
     *
     */
    @GetMapping(value={"/joball/{etldt}/{schemaName}/{tableName}","/joball/{etldt}/{schemaName}","/joball/{etldt}"})
    public String backupall(@PathVariable("etldt") String etldt,
                            @PathVariable(value="schemaName",required=false) String schemaName,
                            @PathVariable(value="tableName",required=false) String tableName)
    {
        gbaseUtil.connectGBase();
        gbaseLoad.loadTable(etldt,schemaName,tableName,"5");
        gbaseLoad.loadTable(etldt,schemaName,tableName,"2");
        gbaseLoad.loadTable(etldt,schemaName,tableName,"0");
        gbaseLoad.loadTable(etldt,schemaName,tableName,"1");
        //gbaseUtil.closeConnection();
        return prefix + "/result";
    }

    /**
     * 根据传入的日期 跑最近几天的数据
     * 当天全部数据入库 暂时不加全量  全量26日已经执行过了
     * 自动_增变量表入库 也就是类型为1 的  这种最复杂
     * 自动_全量表入库 也就是类型为0的  这种非常简单
     * 自动_增量+大文本增量表入库 也就是类型为2+5 的  这种非常简单
     *
     */

    @GetMapping(value={"/loadMany/{etlnum}/{schemaName}/{tableName}"})
    public String loadMany(@PathVariable("etlnum") String etlnum,
                            @PathVariable(value="schemaName",required=false) String schemaName,
                            @PathVariable(value="tableName",required=false) String tableName)
    {
        gbaseUtil.connectGBase();
        int num=0;
        num = Integer.valueOf(etlnum);
        String todayStr = DateUtils.getdateYYYYMMDD();
        for(int i=num;i>0;i--){
            //昨天日期
            String yestDay = DateUtil.addDay(todayStr, -1*i);
            gbaseLoad.loadTable(yestDay,schemaName,tableName,"5");
            gbaseLoad.loadTable(yestDay,schemaName,tableName,"2");
            gbaseLoad.loadTable(yestDay,schemaName,tableName,"0");
            gbaseLoad.loadTable(yestDay,schemaName,tableName,"1");
        }

        //gbaseUtil.closeConnection();
        return prefix + "/result";
    }


    /**
     * 根据传入的日期 将表全量数据跑起来，如果是增量的就只会传入每天增量的部分（这部分可能根据时点也能得出后续日期的当天数据）
     * etlnum：  截至到昨天往前推多少钱
     * onlyLast： 传入1 就只跑最后一天数据，否则每天都跑
     * schemaName：  模式
     * tableName：  名称
     * drop：   任意输入不删除原表，输入'drop'，会删除 schemaName.tableName_ql 的表，然后重新创建做
     */
    //http://32.14.47.24:85/gbase/TABLEINFO/loadQlMany/{etlnum}/{onlyLast}/{schemaName}/{tableName}/{drop}
    @GetMapping(value={"/loadQlMany/{etlnum}/{onlyLast}/{schemaName}/{tableName}/{drop}"})
    public String loadQlMany(@PathVariable("etlnum") String etlnum,
                             @PathVariable(value="onlyLast") String onlyLast,
                           @PathVariable(value="schemaName") String schemaName,
                           @PathVariable(value="tableName") String tableName, @PathVariable(value="drop",required=false) String drop)
    {
        gbaseUtil.connectGBase();
        int num=0;
        num = Integer.valueOf(etlnum);
        String todayStr = DateUtils.getdateYYYYMMDD();
        if(null!=drop&&"drop".equals(drop)){
            gbaseLoad.dropCreatetable(schemaName,tableName);
        }
        for(int i=num;i>0;i--){
            //昨天日期
            String yestDay = DateUtil.addDay(todayStr, -1*i);
            if((DateUtil.isLastDay(yestDay)&&"1".equals(onlyLast))||(!"1".equals(onlyLast))){
                    gbaseLoad.qletldt(schemaName,tableName,yestDay);
            }
        }
        return prefix + "/result";
    }


    /**
     * 根据传入的日期 将表全量数据跑起来，只跑某一天数据
     * etldt：  天
     * schemaName：  模式
     * tableName：  名称
     */
    //http://32.14.47.24:85/gbase/TABLEINFO/loadQlMany/{etlnum}/{onlyLast}/{schemaName}/{tableName}/{drop}
    @GetMapping(value={"/loadQlOne/{etldt}/{schemaName}/{tableName}"})
    public String loadQlOne(@PathVariable("etldt") String etldt,
                             @PathVariable(value="schemaName") String schemaName,
                             @PathVariable(value="tableName") String tableName)
    {
        gbaseUtil.connectGBase();
        gbaseLoad.qletldt(schemaName,tableName,etldt);
        return prefix + "/result";
    }




    /**
     * 新增下发基础表
     */
    @GetMapping("/add")
    public String add()
    {
        return prefix + "/add";
    }

    /**
     * 新增保存下发基础表
     */
    @RequiresPermissions("gbase:TABLEINFO:add")
    @Log(title = "下发基础表", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(TableInfo tableInfo)
    {
        return toAjax(tableInfoService.insertTableInfo(tableInfo));
    }

    /**
     * 修改下发基础表
     */
    @GetMapping("/edit/{jobId}")
    public String edit(@PathVariable("jobId") String jobId, ModelMap mmap)
    {
        TableInfo tableInfo = tableInfoService.selectTableInfoById(jobId);
        mmap.put("tableInfo", tableInfo);
        return prefix + "/edit";
    }

    /**
     * 修改保存下发基础表
     */
    @RequiresPermissions("gbase:TABLEINFO:edit")
    @Log(title = "下发基础表", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(TableInfo tableInfo)
    {
        return toAjax(tableInfoService.updateTableInfo(tableInfo));
    }

    /**
     * 删除下发基础表
     */
    @RequiresPermissions("gbase:TABLEINFO:remove")
    @Log(title = "下发基础表", businessType = BusinessType.DELETE)
    @PostMapping( "/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        return toAjax(tableInfoService.deleteTableInfoByIds(ids));
    }
}
